package reflect;

import java.lang.reflect.Method;
/**
 * JAVA 反射机制
 * 反射是java的动态机制,可以在程序[运行期间]在确定对象的实例化,方法的调用等操作.
 * 动态机制可以提高代码的灵活度,但是运行效率较低并且开销较大.
 * 因此不能过度的依赖反射机制.
 */
public class ReflectDemo {
    public static void main(String[] args) {
        /*
            类对象 Class类的实例
            在JVM中每个被加载的类都有且只有一个Class的实例与之对应.
            当我们需要使用一个类时,JVM会首先读取该类的.class(字节码)文件,读取后就会同时
            实例化一个Class的实例用来记录该类的信息(名字,构造器,方法,属性等)并与该类绑定.

            反射的第一步就是要获取待操作的类的类对象
            获取类对象的方式:
            1:类名.class
            Class cls = String.class;
            Class cls = int.class;      注:基本类型只有这一种获取类对象方式

            2:Class.forName(String className) 通过指定类的完全限定名获取(包名.类名)
            Class cls = Class.forName("java.lang.String");
            Class cls = Class.forName("java.util.ArrayList");

            3:类加载器模式ClassLoader
         */

        /*获取String的类对象*/
        Class cls = String.class;

        String name = cls.getName();/*获取当前类对象所表示的类的完全限定名*/
        System.out.println(name);

        name = cls.getSimpleName();/*仅获取类名*/
        System.out.println(name);
/*java.lang.reflect.Method;
* Method每一个实例用于表示一个方法*/
        Method[] methods  = cls.getMethods();/*获取当前类对象所表示的类的所有的公开方法*/
        for (Method method: methods
             ) {
            String methodname = method.getName();
            System.out.println(methodname);
        }
        /*Package的每一个实例都表示一个包*/
        Package pack = cls.getPackage();
        System.out.println(pack.getName());/*包名*/
    }
}
